/*
 * RtspCaster.h
 *
 *  Created on: 2016年4月6日
 *      Author: terry
 */

#ifndef RTSPCASTER_H_
#define RTSPCASTER_H_


////////////////////////////////////////////////////////////////////////////

#ifdef WIN32

    #ifndef NOMINMAX
    #define NOMINMAX
    #endif //NOMINMAX

	#include <Windows.h>
#else

#endif //WIN32


////////////////////////////////////////////////////////////////////////////

#ifdef _MSC_VER
    typedef signed char     int8_t;
    typedef unsigned char   uint8_t;
    typedef short           int16_t;
    typedef unsigned short  uint16_t;
    typedef int             int32_t;
    typedef unsigned        uint32_t;
    typedef long long       int64_t;
    typedef unsigned long long   uint64_t;
#else
    #include <stdint.h>
    typedef void*   HANDLE;
#endif //_MSC_VER


///////////////////////////////////////////////////////////////////
#ifdef WIN32
    #ifndef DLLEXPORT
    #define DLLEXPORT __declspec(dllexport)
    #endif //DLLEXPORT
#else
    #define DLLEXPORT
#endif //WIN32

///////////////////////////////////////////////////////////////////
#ifdef __cplusplus
extern "C"
{
#endif

/////////////////////////////////////////////////////////////////////////////
#ifndef MKBETAG
#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
#endif //MKBETAG


/// 编码
enum MCodec
{
    MCODEC_NONE = 0,

    MCODEC_H264 = 28,
	MCODEC_HEVC = MKBETAG('H','2','6','5'), /// H.265
	MCODEC_H265 = MCODEC_HEVC,

    MCODEC_G711U = 65542,
    MCODEC_G711A,

    MCODEC_MP3 = 0x15001,
    MCODEC_AAC = 0x15002,
    MCODEC_AC3 = 0x15003,
    MCODEC_VORBIS = 0x15005,


	MCODEC_RAW = 0x10101010

};

/// 媒体格式
struct MFormat
{
	int codec;		/// 视频编码  @see MCodec
	int width;		/// 视频高
	int height;		/// 视频宽
	int fps;		/// 帧率
	int profile;

	int audioCodec;	/// 音频编码  @see MCodec
	int channels;	/// 通道数
	int sampleRate;	/// 采样率
	int audioProfile;	/// 档次

	int vPropSize;		/// 视频解码参数, 对于H.264是sps+pps, 对于H.265是vps+sps+pps
	unsigned char* vProp;

};

/// 媒体包
struct MPacket
{
	uint8_t* data;	/// 数据指针
	int size;		/// 数据长度
	int64_t pts;	/// 时间戳
	int duration;	/// 时长
	int flags;		/// 标识
};


/**
 * 初始化
 * @param port	RTSP端口
 * @return 0 表示成功
 */
DLLEXPORT int caster_init(int port);

/**
 * 反初始化
 * @return
 */
DLLEXPORT int caster_quit();

/**
 * 设置端口范围
 * @param minPort
 * @param maxPort
 * @return
 */
DLLEXPORT int caster_set_port_range(int minPort, int maxPort);

/**
 * 打开通道
 * @param handle 返回的通道句柄
 * @param name	通道名称
 * @param fmt   媒体格式
 * @return 0 表示成功
 */
DLLEXPORT int caster_chl_open(HANDLE* handle, const char* name, const MFormat* fmt);

/**
 * 关闭通道
 * @param handle 通道句柄
 */
DLLEXPORT void caster_chl_close(HANDLE handle);

/**
 * 通道是否打开, 即判断有效
 * @param handle 通道句柄
 * @return > 0 表示有效
 */
DLLEXPORT int caster_chl_is_open(HANDLE handle);

/**
 *
 * @param handle
 * @param prop
 * @param size
 * @return
 */
DLLEXPORT int caster_chl_set_video_prop(HANDLE handle, const uint8_t* prop, int size);

/**
 * 获取通道媒体格式
 * @param handle   通道句柄
 * @param fmt 媒体格式
 * @return 0 表示成功
 */
DLLEXPORT int caster_chl_get_format(HANDLE handle, MFormat* fmt);

/**
 * 写视频包
 * 视频的时钟频率为90000, pts, duration均以此为单位
 * 包的duration为必填字段, 否则造成音视频不同步
 * @param handle  通道句柄
 * @param pkt  包
 * @return 0 表示成功
 */
DLLEXPORT int caster_chl_write_video(HANDLE handle, const MPacket* pkt);

/**
 * 写音频包
 * 音频的时钟频率为采样率
 * 包的duration为必填字段, 否则造成音视频不同步
 * @param handle
 * @param pkt
 * @return
 */
DLLEXPORT int caster_chl_write_audio(HANDLE handle, const MPacket* pkt);







/////////////////////////////////////////////////////////////////////////////

#ifdef __cplusplus
}
#endif


#endif /* RTSPCASTER_H_ */
